package com.cskaoyan.javase.oop2.encapsulate._2polymorphic._2advantage;

/**
 * 思考一个问题:
 *      在方法调用时,需要根据形参传入具体对应的实参
 *      那么实参的数据类型需要和形参数据类型保持完全一致吗?
 * 不需要,只需要保持兼容就可以了.
 * 只要实参的数据类型能够自动类型转换到形参的数据类型,那么就允许这个实参传入方法
 * 这个规则对基本/引用数据类型都生效
 *
 * 总结一下当方法的形参是引用数据类型形参时,可以传入的对象:
 *      1.可以和形参数据类型保持一致,传入对应的对象
 *      2.还可以传入形参数据类型的子类对象(只要是子类对象,都可以)
 *
 * 举一反三
 * 既然实参和形参的数据类型有以上特点
 * 那么返回值类型和具体返回值也一样可以存在上述特点
 *
 * 如果具体返回值对象的类型,可以自动类型转换到返回值类型,也是允许作为返回值的
 *
 * @since 11:12
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        test(new Father());
        test(new Son());
        test(new Grandson());

        test2("hello");
        test2(new Father());
        test2(new int[3]);
    }

    public static void test(Father f) {
    }

    public static void test2(Object o) {
    }

    public static Father test3() {
        // return new Father();
        // return new Son();
        return new Grandson();
    }

    public static Object test4() {
        // return new Father();
        // return new Son();
        // return new Grandson();
        return "hello";
    }
}

class Father {
}

class Son extends Father {
}

class Grandson extends Son {

}